package utils;

import entity.Score;
import entity.Student;

import java.time.LocalDate;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * 输入验证工具类
 */
public class ValidationUtil {
    
    // 学号格式：9位数字
    private static final Pattern STUDENT_ID_PATTERN = Pattern.compile("^\\d{9}$");
    
    /**
     * 验证学号
     * @param studentId 学号
     * @param existingStudents 现有学生Map（用于检查重复）
     * @return 验证结果消息，null表示验证通过
     */
    public static String validateStudentId(String studentId, Map<String, Student> existingStudents) {
        if (studentId == null || studentId.trim().isEmpty()) {
            return "学号不能为空";
        }
        
        studentId = studentId.trim();
        
        if (!STUDENT_ID_PATTERN.matcher(studentId).matches()) {
            return "学号格式错误，必须是9位数字";
        }
        
        if (existingStudents != null && existingStudents.containsKey(studentId)) {
            return "学号已存在，不能重复";
        }
        
        return null;
    }
    
    /**
     * 验证学号（用于成绩录入时检查学生是否存在）
     * @param studentId 学号
     * @param existingStudents 现有学生Map
     * @return 验证结果消息，null表示验证通过
     */
    public static String validateStudentIdExists(String studentId, Map<String, Student> existingStudents) {
        if (studentId == null || studentId.trim().isEmpty()) {
            return "学号不能为空";
        }
        
        studentId = studentId.trim();
        
        if (!STUDENT_ID_PATTERN.matcher(studentId).matches()) {
            return "学号格式错误，必须是9位数字";
        }
        
        if (existingStudents == null || !existingStudents.containsKey(studentId)) {
            return "学号不存在，请先添加该学生信息";
        }
        
        return null;
    }
    
    /**
     * 验证姓名
     * @param name 姓名
     * @return 验证结果消息，null表示验证通过
     */
    public static String validateName(String name) {
        if (name == null || name.trim().isEmpty()) {
            return "姓名不能为空";
        }
        
        name = name.trim();
        
        if (name.length() < 2 || name.length() > 20) {
            return "姓名长度必须在2-20个字符之间";
        }
        
        return null;
    }
    
    /**
     * 验证年龄
     * @param age 年龄
     * @return 验证结果消息，null表示验证通过
     */
    public static String validateAge(int age) {
        if (age < 16 || age > 30) {
            return "年龄必须在16-30之间";
        }
        
        return null;
    }
    
    /**
     * 验证专业
     * @param major 专业
     * @return 验证结果消息，null表示验证通过
     */
    public static String validateMajor(String major) {
        if (major == null || major.trim().isEmpty()) {
            return "专业不能为空";
        }
        
        major = major.trim();
        
        if (major.length() > 50) {
            return "专业名称不能超过50个字符";
        }
        
        return null;
    }
    
    /**
     * 验证成绩
     * @param score 成绩值
     * @param subjectName 科目名称（用于错误提示）
     * @return 验证结果消息，null表示验证通过
     */
    public static String validateScore(double score, String subjectName) {
        if (score < 0 || score > 100) {
            return subjectName + "成绩必须在0-100之间";
        }
        
        return null;
    }
    
    /**
     * 验证成绩录入（检查是否重复录入）
     * @param studentId 学号
     * @param existingScores 现有成绩Map
     * @return 验证结果消息，null表示验证通过
     */
    public static String validateScoreNotExists(String studentId, Map<String, Score> existingScores) {
        if (existingScores != null && existingScores.containsKey(studentId)) {
            return "该学生的成绩已存在，不能重复录入";
        }
        
        return null;
    }
    
    /**
     * 验证日期输入
     * @param year 年份
     * @param month 月份
     * @param day 日期
     * @return 验证结果消息，null表示验证通过
     */
    public static String validateDate(int year, int month, int day) {
        try {
            LocalDate.of(year, month, day);
            return null; // 验证通过
        } catch (Exception e) {
            return "日期格式错误，请输入有效的日期";
        }
    }
}